package com.ycy;

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.junit.Test;

import java.util.List;
import java.util.concurrent.CountDownLatch;

public class ZookeeperClientDemo implements Watcher {


  private ZooKeeper zookeeper;
  /**
   * 超时时间
   */

  private static final int SESSION_TIME_OUT = 10;

  private CountDownLatch countDownLatch = new CountDownLatch(1);

  @Override
  public void process(WatchedEvent event) {
    if (event.getState() == Watcher.Event.KeeperState.SyncConnected) {
      System.out.println("Watch received event");
      countDownLatch.countDown();
    }
    System.out.println(event);
  }


  /**
   * 连接zookeeper
   *
   * @param host
   * @throws Exception
   */
  public void connectZookeeper(String host) throws Exception {
    zookeeper = new ZooKeeper(host, SESSION_TIME_OUT, this);
    countDownLatch.await();
    System.out.println("zookeeper connection success");
  }

  /**
   * 创建节点
   *
   * @param path
   * @param data
   * @throws Exception
   */
  public String createNode(String path, String data) throws Exception {
    return this.zookeeper.create(path, data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
  }

  public String createZNode(String path, String data) throws Exception {
    return this.zookeeper.create(path, data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
  }

  /**
   * 获取路径下所有子节点
   *
   * @param path
   * @return
   * @throws KeeperException
   * @throws InterruptedException
   */


  public List<String> getChildren(String path) throws KeeperException, InterruptedException {
    List<String> children = zookeeper.getChildren(path, false);
    return children;
  }

  /**
   * 获取节点上面的数据
   *
   * @param path 路径
   * @return
   * @throws KeeperException
   * @throws InterruptedException
   */


  public String getData(String path) throws KeeperException, InterruptedException {
    byte[] data = zookeeper.getData(path, false, null);
    if (data == null) {
      return "";
    }
    return new String(data);
  }

  /**
   * 设置节点信息
   *
   * @param path 路径
   * @param data 数据
   * @return
   * @throws KeeperException
   * @throws InterruptedException
   */


  public Stat setData(String path, String data) throws KeeperException, InterruptedException {
    Stat stat = zookeeper.setData(path, data.getBytes(), -1);
    return stat;
  }

  /**
   * 删除节点
   *
   * @param path
   * @throws InterruptedException
   * @throws KeeperException
   */


  public void deleteNode(String path) throws InterruptedException, KeeperException {
    zookeeper.delete(path, -1);
  }

  /**
   * 获取创建时间
   *
   * @param path
   * @return
   * @throws KeeperException
   * @throws InterruptedException
   */
  public String getCTime(String path) throws KeeperException, InterruptedException {
    Stat stat = zookeeper.exists(path, false);
    return String.valueOf(stat.getCtime());
  }

  /**
   * 获取某个路径下孩子的数量
   *
   * @param path
   * @return
   * @throws KeeperException
   * @throws InterruptedException
   */
  public Integer getChildrenNum(String path) throws KeeperException, InterruptedException {
    int childenNum = zookeeper.getChildren(path, false).size();
    return childenNum;
  }

  /**
   * 关闭连接
   *
   * @throws InterruptedException
   */


  public void closeConnection() throws InterruptedException {
    if (zookeeper != null) {
      zookeeper.close();
    }
  }

  public static void main(String[] args) {
    ZookeeperClientDemo zookeeper = new ZookeeperClientDemo();
    try {
      System.out.println("开始连接");
      zookeeper.connectZookeeper("127.0.0.1:2181");
      System.out.println("连接结束");
    } catch (Exception e) {
      e.printStackTrace();
    }

    List<String> children = null;
    try {
      children = zookeeper.getChildren("/");

      zookeeper.setData("/ycy/node3", "ha");

    } catch (KeeperException e) {
      e.printStackTrace();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    System.out.println(children);
    try {
      zookeeper.closeConnection();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }

  @Test
  public void create() {
    ZookeeperClientDemo zookeeper = new ZookeeperClientDemo();
    String url = "10.211.55.3:2182";
    try {
      System.out.println("开始连接");
      zookeeper.connectZookeeper(url);
      System.out.println("连接结束");
    } catch (Exception e) {
      e.printStackTrace();
    }

    try {
      zookeeper.zookeeper.create("/javalock", "haha".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
    } catch (KeeperException e) {
      e.printStackTrace();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }


    try {
      zookeeper.closeConnection();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }

}
